WebAssemblyã®é¢æ°ããŒãã«æé©åæè¡ãæ¢æ±ããã¢ã¯ã»ã¹é床ãšã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ãåäžãããŸããäžçäžã®éçºè ã®ããã®å®è·µçãªæŠç¥ãåŠã³ãŸãããã
WebAssemblyããŒãã«ã®ããã©ãŒãã³ã¹æé©åïŒé¢æ°ããŒãã«ã®ã¢ã¯ã»ã¹é床
WebAssembly (Wasm) ã¯ãWebãã©ãŠã¶ããã®ä»æ§ã ãªç°å¢ã§ãã€ãã£ãã«è¿ãããã©ãŒãã³ã¹ãå®çŸãã匷åãªæè¡ãšããŠç»å ŽããŸãããWasmã®ããã©ãŒãã³ã¹ã«ãããéèŠãªåŽé¢ã®äžã€ãã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ã®å¹çæ§ã§ãããããã®ããŒãã«ã¯é¢æ°ãžã®ãã€ã³ã¿ãæ ŒçŽããåçãªé¢æ°åŒã³åºããå¯èœã«ããŸããããã¯å€ãã®ã¢ããªã±ãŒã·ã§ã³ã«ãããåºæ¬çãªæ©èœã§ãããããã£ãŠã颿°ããŒãã«ã®ã¢ã¯ã»ã¹é床ãæé©åããããšã¯ãæé«ã®ããã©ãŒãã³ã¹ãéæããããã«äžå¯æ¬ ã§ãããã®ããã°èšäºã§ã¯ã颿°ããŒãã«ã¢ã¯ã»ã¹ã®è€éããæãäžããæ§ã ãªæé©åæŠç¥ãæ¢æ±ããWasmã¢ããªã±ãŒã·ã§ã³ã匷åããããšããäžçäžã®éçºè ã«å®è·µçãªæŽå¯ãæäŸããŸãã
WebAssembly颿°ããŒãã«ã®çè§£
WebAssemblyã§ã¯ã颿°ããŒãã«ã¯é¢æ°ã®ã¢ãã¬ã¹ïŒãã€ã³ã¿ïŒãä¿æããããŒã¿æ§é ã§ããããã¯ã颿°ãæ¢ç¥ã®ã¢ãã¬ã¹ãä»ããŠçŽæ¥åŒã³åºãããå¯èœæ§ããããã€ãã£ãã³ãŒãã§ã®é¢æ°åŒã³åºãã®æ±ããæ¹ãšã¯ç°ãªããŸãã颿°ããŒãã«ã¯éæ¥çãªã¬ãã«ãæäŸããåçãã£ã¹ãããã鿥颿°åŒã³åºããããã³ãã©ã°ã€ã³ãã¹ã¯ãªããã£ã³ã°ãªã©ã®æ©èœãå¯èœã«ããŸããããŒãã«å ã®é¢æ°ã«ã¢ã¯ã»ã¹ããã«ã¯ããªãã»ãããèšç®ãããã®ãªãã»ããã«ããã¡ã¢ãªäœçœ®ãããªãã¡ã¬ã³ã¹ããããšãå«ãŸããŸãã
以äžã¯ã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãã©ã®ããã«æ©èœãããã®ç°¡ç¥åãããæŠå¿µã¢ãã«ã§ãïŒ
- ããŒãã«ã®å®£èšïŒ ããŒãã«ã宣èšãããèŠçŽ ã®åïŒéåžžã¯é¢æ°ãã€ã³ã¿ïŒãšåæãµã€ãºããã³æå€§ãµã€ãºãæå®ãããŸãã
- 颿°ã€ã³ããã¯ã¹ïŒ 颿°ã鿥çã«åŒã³åºãããéïŒäŸïŒé¢æ°ãã€ã³ã¿çµç±ïŒã颿°ããŒãã«ã®ã€ã³ããã¯ã¹ãæäŸãããŸãã
- ãªãã»ããèšç®ïŒ ã€ã³ããã¯ã¹ã«å颿°ãã€ã³ã¿ã®ãµã€ãºïŒäŸïŒãã©ãããã©ãŒã ã®ã¢ãã¬ã¹ãµã€ãºã«å¿ããŠ4ãã€ããŸãã¯8ãã€ãïŒãä¹ããŠãããŒãã«å ã®ã¡ã¢ãªãªãã»ãããèšç®ããŸãã
- ã¡ã¢ãªã¢ã¯ã»ã¹ïŒ èšç®ããããªãã»ããã«ããã¡ã¢ãªäœçœ®ãèªã¿åãã颿°ãã€ã³ã¿ãååŸããŸãã
- 鿥åŒã³åºãïŒ ååŸãã颿°ãã€ã³ã¿ã䜿çšããŠãå®éã®é¢æ°åŒã³åºããè¡ããŸãã
ãã®ããã»ã¹ã¯æè»æ§ãããäžæ¹ã§ããªãŒããŒããããçºçãããå¯èœæ§ããããŸããæé©åã®ç®æšã¯ããã®ãªãŒããŒããããæå°éã«æãããããã®æäœã®é床ãæå€§éã«é«ããããšã§ãã
颿°ããŒãã«ã®ã¢ã¯ã»ã¹é床ã«åœ±é¿ãäžããèŠå
ããã€ãã®èŠå ãã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹é床ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãïŒ
1. ããŒãã«ã®ãµã€ãºãšçæ§
颿°ããŒãã«ã®ãµã€ãºãç¹ã«ãã®ããŒãã«ãã©ãã ãåãŸã£ãŠãããã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ããŸãã倧ããªããŒãã«ã¯ã¡ã¢ãªãããããªã³ããå¢å ãããã¢ã¯ã»ã¹äžã«ãã£ãã·ã¥ãã¹ãåŒãèµ·ããå¯èœæ§ããããŸããçæ§ïŒå®éã«äœ¿çšãããŠããããŒãã«ã¹ãããã®å²åïŒãéèŠãªèæ ®äºé ã§ããå€ãã®ãšã³ããªãæªäœ¿çšã§ããçãªããŒãã«ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãäºæž¬ãã«ãããªããããããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸããããŒã«ãã³ã³ãã€ã©ã¯ãããŒãã«ãµã€ãºãå®çšçãªç¯å²ã§ã§ããã ãå°ãã管çããããšåªããŸãã
2. ã¡ã¢ãªã¢ã©ã€ã¡ã³ã
颿°ããŒãã«ã®é©åãªã¡ã¢ãªã¢ã©ã€ã¡ã³ãã¯ãã¢ã¯ã»ã¹é床ãåäžãããããšãã§ããŸããããŒãã«ãããã³ãã®äžã®åã ã®é¢æ°ãã€ã³ã¿ãã¯ãŒãå¢çïŒäŸïŒ4ãã€ããŸãã¯8ãã€ãïŒã«ã¢ã©ã€ã¡ã³ãããããšã§ãå¿ èŠãªã¡ã¢ãªã¢ã¯ã»ã¹ã®åæ°ãæžããããã£ãã·ã¥ãå¹ççã«äœ¿çšããå¯èœæ§ãé«ããããšãã§ããŸããçŸä»£ã®ã³ã³ãã€ã©ã®å€ãã¯ãããåŠçããŸãããéçºè ã¯æåã§ããŒãã«ãæäœããéã«æ³šæããå¿ èŠããããŸãã
3. ãã£ãã·ã³ã°
CPUãã£ãã·ã¥ã¯ã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãæé©åããäžã§éèŠãªåœ¹å²ãæãããŸããé »ç¹ã«ã¢ã¯ã»ã¹ããããšã³ããªã¯ãçæ³çã«ã¯CPUã®ãã£ãã·ã¥å ã«ååšãã¹ãã§ãããããã©ã®çšåºŠéæã§ãããã¯ãããŒãã«ã®ãµã€ãºãã¡ã¢ãªã¢ã¯ã»ã¹ãã¿ãŒã³ãããã³ãã£ãã·ã¥ãµã€ãºã«äŸåããŸãããã£ãã·ã¥ããããå€ãã³ãŒãã¯ãããé«éã«å®è¡ãããŸãã
4. ã³ã³ãã€ã©ã®æé©å
ã³ã³ãã€ã©ã¯ã颿°ããŒãã«ã¢ã¯ã»ã¹ã®ããã©ãŒãã³ã¹ã«å€§ããè²¢ç®ããŸããC/C++ãRustïŒWebAssemblyã«ã³ã³ãã€ã«ãããïŒã®ãããªã³ã³ãã€ã©ã¯ã以äžãå«ãå€ãã®æé©åãå®è¡ããŸãïŒ
- ã€ã³ã©ã€ã³åïŒ å¯èœãªå Žåãã³ã³ãã€ã©ã¯é¢æ°åŒã³åºããã€ã³ã©ã€ã³åãã颿°ããŒãã«ã®ã«ãã¯ã¢ãããå®å šã«æé€ããããšããããŸãã
- ã³ãŒãçæïŒ ã³ã³ãã€ã©ã¯ããªãã»ããèšç®ãã¡ã¢ãªã¢ã¯ã»ã¹ã«äœ¿çšãããç¹å®ã®åœä»€ãå«ããçæãããã³ãŒããæ±ºå®ããŸãã
- ã¬ãžã¹ã¿å²ãåœãŠïŒ ããŒãã«ã€ã³ããã¯ã¹ã颿°ãã€ã³ã¿ãªã©ã®äžéå€ãCPUã¬ãžã¹ã¿ã§å¹ççã«äœ¿çšããããšã§ãã¡ã¢ãªã¢ã¯ã»ã¹ãåæžã§ããŸãã
- ãããã³ãŒãé€å»ïŒ æªäœ¿çšã®é¢æ°ãããŒãã«ããåé€ããããšã§ãããŒãã«ãµã€ãºãæå°åããŸãã
5. ããŒããŠã§ã¢ã¢ãŒããã¯ãã£
åºç€ãšãªãããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã®ç¹æ§ããã£ãã·ã¥ã®æåã«åœ±é¿ãäžããŸãããã£ãã·ã¥ãµã€ãºãã¡ã¢ãªåž¯åå¹ ãCPUåœä»€ã»ãããªã©ã®èŠå ãã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãã©ã®ããã«å®è¡ããããã«åœ±é¿ããŸããéçºè ã¯ããŒããŠã§ã¢ãšçŽæ¥å¯Ÿè©±ããããšã¯ããŸããããŸãããããã®åœ±é¿ãèªèããå¿ èŠã«å¿ããŠã³ãŒãã調æŽããããšãã§ããŸãã
æé©åæŠç¥
颿°ããŒãã«ã®ã¢ã¯ã»ã¹é床ãæé©åããã«ã¯ãã³ãŒãèšèšãã³ã³ãã€ã©èšå®ããããŠå Žåã«ãã£ãŠã¯å®è¡æã®èª¿æŽãçµã¿åãããããšãå«ãŸããŸãã以äžã«äž»èŠãªæŠç¥ãæããŸãïŒ
1. ã³ã³ãã€ã©ãã©ã°ãšèšå®
ã³ã³ãã€ã©ã¯Wasmãæé©åããããã®æãéèŠãªããŒã«ã§ããèæ ®ãã¹ãäž»èŠãªã³ã³ãã€ã©ãã©ã°ã«ã¯ä»¥äžããããŸãïŒ
- æé©åã¬ãã«ïŒ å©çšå¯èœãªæé«ã®æé©åã¬ãã«ïŒäŸïŒclang/LLVMã®`-O3`ïŒã䜿çšããŸããããã«ãããã³ã³ãã€ã©ã¯ç©æ¥µçã«ã³ãŒããæé©åããããã«æç€ºãããŸãã
- ã€ã³ã©ã€ã³åïŒ é©åãªå Žæã§ã€ã³ã©ã€ã³åãæå¹ã«ããŸããããã«ããã颿°ããŒãã«ã®ã«ãã¯ã¢ãããæé€ã§ããããšããããããŸãã
- ã³ãŒãçææŠç¥ïŒ äžéšã®ã³ã³ãã€ã©ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã鿥åŒã³åºãã«å¯ŸããŠç°ãªãã³ãŒãçææŠç¥ãæäŸããŸãããããã®ãªãã·ã§ã³ã詊ããŠãã¢ããªã±ãŒã·ã§ã³ã«æé©ãªãã®ãèŠã€ããŠãã ããã
- ãããã¡ã€ã«ã¬ã€ãä»ãæé©å (PGO)ïŒ å¯èœã§ããã°PGOã䜿çšããŸãããã®æè¡ã«ãããã³ã³ãã€ã©ã¯å®éã®äœ¿çšãã¿ãŒã³ã«åºã¥ããŠã³ãŒããæé©åã§ããŸãã
2. ã³ãŒãæ§é ãšèšèš
ã³ãŒãã®æ§é åã®ä»æ¹ã¯ã颿°ããŒãã«ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãïŒ
- 鿥åŒã³åºããæå°éã«æããïŒ éæ¥é¢æ°åŒã³åºãã®æ°ãæžãããŸããå¯èœã§ããã°ãçŽæ¥åŒã³åºããã€ã³ã©ã€ã³åãªã©ã®ä»£æ¿æ¡ãæ€èšããŠãã ããã
- 颿°ããŒãã«ã®äœ¿çšãæé©åããïŒ é¢æ°ããŒãã«ãå¹ççã«äœ¿çšããããã«ã¢ããªã±ãŒã·ã§ã³ãèšèšããŸããé床ã«å€§ããããŒãã«ãçãªããŒãã«ãäœæããã®ã¯é¿ããŠãã ããã
- ã·ãŒã±ã³ã·ã£ã«ã¢ã¯ã»ã¹ãåªå ããïŒ é¢æ°ããŒãã«ã®ãšã³ããªã«ã¢ã¯ã»ã¹ããéã¯ããã£ãã·ã¥ã®å±ææ§ãåäžãããããã«ãã·ãŒã±ã³ã·ã£ã«ã«ïŒãŸãã¯ãã¿ãŒã³ã«åŸã£ãŠïŒã¢ã¯ã»ã¹ããããã«ããŠãã ãããããŒãã«å ãã©ã³ãã ã«ãžã£ã³ãããã®ã¯é¿ããŠãã ããã
- ããŒã¿ã®å±ææ§ïŒ 颿°ããŒãã«èªäœãšé¢é£ã³ãŒãããCPUã«ãšã£ãŠã¢ã¯ã»ã¹ããããã¡ã¢ãªé åã«é 眮ãããããã«ããŸãã
3. ã¡ã¢ãªç®¡çãšã¢ã©ã€ã¡ã³ã
æ éãªã¡ã¢ãªç®¡çãšã¢ã©ã€ã¡ã³ãã¯ãå€§å¹ ãªããã©ãŒãã³ã¹åäžãããããå¯èœæ§ããããŸãïŒ
- 颿°ããŒãã«ãã¢ã©ã€ã¡ã³ãããïŒ é¢æ°ããŒãã«ãé©åãªå¢çïŒäŸïŒ64ãããã¢ãŒããã¯ãã£ã§ã¯8ãã€ãïŒã«ã¢ã©ã€ã¡ã³ããããŠããããšã確èªããŸããããã«ãããããŒãã«ããã£ãã·ã¥ã©ã€ã³ã«æããããŸãã
- ã«ã¹ã¿ã ã¡ã¢ãªç®¡çãæ€èšããïŒ å Žåã«ãã£ãŠã¯ãã¡ã¢ãªãæåã§ç®¡çããããšã§ã颿°ããŒãã«ã®é 眮ãšã¢ã©ã€ã¡ã³ãããã现ããå¶åŸ¡ã§ããŸãããããè¡ãå Žåã¯éåžžã«æ³šæãå¿ èŠã§ãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«é¢ããèæ ®äºé ïŒ ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæã€èšèªïŒäŸïŒGoãC#ã®äžéšã®Wasmå®è£ ïŒã䜿çšããå Žåãã¬ããŒãžã³ã¬ã¯ã¿ã颿°ããŒãã«ãšã©ã®ããã«çžäºäœçšãããã«æ³šæããŠãã ããã
4. ãã³ãããŒã¯ãšãããã¡ã€ãªã³ã°
Wasmã³ãŒãã宿çã«ãã³ãããŒã¯ãããããã¡ã€ãªã³ã°ããŸããããã«ããã颿°ããŒãã«ã¢ã¯ã»ã¹ã®ããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã䜿çšããããŒã«ã«ã¯ä»¥äžããããŸãïŒ
- ããã©ãŒãã³ã¹ãããã¡ã€ã©ïŒ ãããã¡ã€ã©ïŒãã©ãŠã¶ã«çµã¿èŸŒãŸããŠãããã®ãã¹ã¿ã³ãã¢ãã³ããŒã«ãšããŠå©çšå¯èœãªãã®ïŒã䜿çšããŠãç°ãªãã³ãŒãã»ã¯ã·ã§ã³ã®å®è¡æéãæž¬å®ããŸãã
- ãã³ãããŒã¯ãã¬ãŒã ã¯ãŒã¯ïŒ ãããžã§ã¯ãã«ãã³ãããŒã¯ãã¬ãŒã ã¯ãŒã¯ãçµ±åããŠãããã©ãŒãã³ã¹ãã¹ããèªååããŸãã
- ããã©ãŒãã³ã¹ã«ãŠã³ã¿ïŒ ïŒå©çšå¯èœã§ããã°ïŒããŒããŠã§ã¢ããã©ãŒãã³ã¹ã«ãŠã³ã¿ãå©çšããŠãCPUãã£ãã·ã¥ãã¹ããã®ä»ã®ã¡ã¢ãªé¢é£ã€ãã³ãã«é¢ããããæ·±ãæŽå¯ãåŸãŸãã
5. äŸïŒC/C++ãšclang/LLVM
以äžã¯ã颿°ããŒãã«ã®äœ¿çšæ³ãšããã©ãŒãã³ã¹æé©åãžã®ã¢ãããŒãã瀺ãç°¡åãªC++ã®äŸã§ãïŒ
// main.cpp
#include <iostream>
using FunctionType = void (*)(); // Function pointer type
void function1() {
std::cout << "Function 1 called" << std::endl;
}
void function2() {
std::cout << "Function 2 called" << std::endl;
}
int main() {
FunctionType table[] = {
function1,
function2
};
int index = 0; // Example index from 0 to 1
table[index]();
return 0;
}
clang/LLVMã䜿çšããã³ã³ãã€ã«ïŒ
clang++ -O3 -flto -s -o main.wasm main.cpp -Wl,--export-all --no-entry
ã³ã³ãã€ã©ãã©ã°ã®èª¬æïŒ
- `-O3`ïŒæé«ã¬ãã«ã®æé©åãæå¹ã«ããŸãã
- `-flto`ïŒãªã³ã¯ææé©åãæå¹ã«ããããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸãã
- `-s`ïŒãããã°æ å ±ãåé€ããWASMãã¡ã€ã«ã®ãµã€ãºãåæžããŸãã
- `-Wl,--export-all --no-entry`ïŒWASMã¢ãžã¥ãŒã«ãããã¹ãŠã®é¢æ°ããšã¯ã¹ããŒãããŸãã
æé©åã«é¢ããèæ ®äºé ïŒ
- ã€ã³ã©ã€ã³åïŒ `function1()`ãš`function2()`ãååã«å°ããå Žåãã³ã³ãã€ã©ã¯ããããã€ã³ã©ã€ã³åããå¯èœæ§ããããŸããããã«ããã颿°ããŒãã«ã®ã«ãã¯ã¢ãããäžèŠã«ãªããŸãã
- ã¬ãžã¹ã¿å²ãåœãŠïŒ ã³ã³ãã€ã©ã¯`index`ãšé¢æ°ãã€ã³ã¿ãã¬ãžã¹ã¿ã«ä¿æããããšè©Šã¿ãããé«éãªã¢ã¯ã»ã¹ãå®çŸããŸãã
- ã¡ã¢ãªã¢ã©ã€ã¡ã³ãïŒ ã³ã³ãã€ã©ã¯`table`é åãã¯ãŒãå¢çã«ã¢ã©ã€ã¡ã³ãããã¯ãã§ãã
ãããã¡ã€ãªã³ã°ïŒ Wasmãããã¡ã€ã©ïŒçŸä»£ã®ãã©ãŠã¶ã®éçºè ããŒã«ã§å©çšå¯èœããŸãã¯ã¹ã¿ã³ãã¢ãã³ã®ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšïŒã䜿çšããŠå®è¡æéãåæããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãããŸãã`wasm-objdump -d main.wasm`ã䜿çšããŠwasmãã¡ã€ã«ãéã¢ã»ã³ãã«ããçæãããã³ãŒããšéæ¥åŒã³åºããã©ã®ããã«å®è£ ãããŠãããã«ã€ããŠã®æŽå¯ãåŸãŸãã
6. äŸïŒRust
ããã©ãŒãã³ã¹ã«éç¹ã眮ãRustã¯ãWebAssemblyã«ãšã£ãŠåªããéžæè¢ãšãªãåŸãŸãã以äžã¯ãäžèšãšåãååã瀺ãRustã®äŸã§ãã
// main.rs
fn function1() {
println!("Function 1 called");
}
fn function2() {
println!("Function 2 called");
}
fn main() {
let table: [fn(); 2] = [function1, function2];
let index = 0; // Example index
table[index]();
}
`wasm-pack`ã䜿çšããã³ã³ãã€ã«ïŒ
wasm-pack build --target web --release
`wasm-pack`ãšãã©ã°ã®èª¬æïŒ
- `wasm-pack`ïŒRustã³ãŒããWebAssemblyã«ãã«ãããã³å ¬éããããã®ããŒã«ã
- `--target web`ïŒã¿ãŒã²ããç°å¢ïŒwebïŒãæå®ããŸãã
- `--release`ïŒãªãªãŒã¹ãã«ãã®æé©åãæå¹ã«ããŸãã
Rustã®ã³ã³ãã€ã©ã§ãã`rustc`ã¯ãç¬èªã®æé©åãã¹ã䜿çšãã`release`ã¢ãŒãã§ã¯ããã©ã«ãã®æé©åæŠç¥ãšããŠLTOïŒãªã³ã¯ææé©åïŒãé©çšããŸããããã倿ŽããŠãããã«æé©åã調æŽããããšãã§ããŸãã`cargo build --release`ã䜿çšããŠã³ãŒããã³ã³ãã€ã«ããçµæã®WASMãåæããŸãã
é«åºŠãªæé©åæè¡
éåžžã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã次ã®ãããªããé«åºŠãªæé©åæè¡ã䜿çšã§ããŸãïŒ
1. ã³ãŒãçæ
éåžžã«ç¹å®ã®ããã©ãŒãã³ã¹èŠä»¶ãããå Žåãããã°ã©ã ã§Wasmã³ãŒããçæããããšãæ€èšãããããããŸãããããã«ãããçæãããã³ãŒãã现ããå¶åŸ¡ã§ãã颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãæœåšçã«æé©åã§ããŸããããã¯éåžžãæåã®ã¢ãããŒãã§ã¯ãããŸããããæšæºçãªã³ã³ãã€ã©ã®æé©åã§ã¯äžååãªå Žåã«æ€èšãã䟡å€ããããããããŸããã
2. ç¹å
å¯èœãªé¢æ°ãã€ã³ã¿ã®ã»ãããéãããŠããå Žåã¯ãèãããã颿°ãã€ã³ã¿ã«åºã¥ããŠç°ãªãã³ãŒããã¹ãçæããããšã§ãããŒãã«ã«ãã¯ã¢ããã®å¿ èŠæ§ãæé€ããããã«ã³ãŒããç¹åããããšãæ€èšããŠãã ãããããã¯ãå¯èœæ§ã®æ°ãå°ãªããã³ã³ãã€ã«æã«æ¢ç¥ã§ããå Žåã«ããŸãæ©èœããŸããããã¯ãäŸãã°C++ã®ãã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ãRustã®ãã¯ãã§å®çŸã§ããŸãã
3. å®è¡æã³ãŒãçæ
éåžžã«é«åºŠãªã±ãŒã¹ã§ã¯ãWasmã¢ãžã¥ãŒã«å ã§JITïŒJust-In-TimeïŒã³ã³ãã€ã«æè¡ã䜿çšããŠãå®è¡æã«Wasmã³ãŒããçæããããšãããããããããŸãããããã«ãããç©¶æ¥µã®æè»æ§ãåŸãããŸãããè€éããå€§å¹ ã«å¢ããã¡ã¢ãªãšã»ãã¥ãªãã£ã®æ éãªç®¡çãå¿ èŠã«ãªããŸãããã®æè¡ã¯ãã£ãã«äœ¿çšãããŸããã
å®è·µçãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
WebAssemblyãããžã§ã¯ãã§é¢æ°ããŒãã«ãžã®ã¢ã¯ã»ã¹ãæé©åããããã®å®è·µçãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹ã®æŠèŠã以äžã«ç€ºããŸãïŒ
- é©åãªèšèªãéžæããïŒ C/C++ãšRustã¯ã匷åãªã³ã³ãã€ã©ãµããŒããšã¡ã¢ãªç®¡çãå¶åŸ¡ã§ããèœåã«ãããäžè¬çã«Wasmã®ããã©ãŒãã³ã¹ã«ãšã£ãŠåªããéžæè¢ã§ãã
- ã³ã³ãã€ã©ãåªå ããïŒ ã³ã³ãã€ã©ã¯äž»èŠãªæé©åããŒã«ã§ããã³ã³ãã€ã©ã®ãã©ã°ãšèšå®ã«ç²ŸéããŠãã ããã
- å³å¯ã«ãã³ãããŒã¯ããïŒ æé©åã®ååŸã§åžžã«ã³ãŒãããã³ãããŒã¯ããæå³ã®ããæ¹åãè¡ãããŠããããšã確èªããŸãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ã®åé¡ã蚺æããã®ã«åœ¹ç«ãŠãŠãã ããã
- 宿çã«ãããã¡ã€ã«ããïŒ éçºäžããã³ãªãªãŒã¹æã«ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ã«ããŸããããã«ãããã³ãŒããã¿ãŒã²ãããã©ãããã©ãŒã ã®é²åã«äŒŽã£ãŠå€åããå¯èœæ§ã®ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ã§ããŸãã
- ãã¬ãŒããªããèæ ®ããïŒ æé©åã«ã¯ãã°ãã°ãã¬ãŒããªãã䌎ããŸããäŸãã°ãã€ã³ã©ã€ã³åã¯é床ãåäžãããããšãã§ããŸãããã³ãŒããµã€ãºãå¢å ãããŸãããã¬ãŒããªããè©äŸ¡ããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«åºã¥ããŠæ±ºå®ãäžããŠãã ããã
- ææ°æ å ±ãå ¥æããïŒ WebAssemblyãšã³ã³ãã€ã©æè¡ã®ææ°ã®é²æ©ã«åžžã«æ³šæãæã£ãŠãã ãããã³ã³ãã€ã©ã®æ°ããããŒãžã§ã³ã«ã¯ããã°ãã°ããã©ãŒãã³ã¹ã®æ¹åãå«ãŸããŠããŸãã
- ç°ãªããã©ãããã©ãŒã ã§ãã¹ãããïŒ Wasmã³ãŒããç°ãªããã©ãŠã¶ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãããã³ããŒããŠã§ã¢ãã©ãããã©ãŒã ã§ãã¹ãããŠãæé©åãäžè²«ããçµæãããããããšã確èªããŸãã
- ã»ãã¥ãªãã£ïŒ ç¹ã«å®è¡æã³ãŒãçæãªã©ã®é«åºŠãªæè¡ã䜿çšããå Žåã¯ãåžžã«ã»ãã¥ãªãã£ãžã®åœ±é¿ã«æ³šæããŠãã ããããã¹ãŠã®å ¥åãæ éã«æ€èšŒããã³ãŒããå®çŸ©ãããã»ãã¥ãªãã£ãµã³ãããã¯ã¹å ã§åäœããããšã確èªããŠãã ããã
- ã³ãŒãã¬ãã¥ãŒïŒ 颿°ããŒãã«ãžã®ã¢ã¯ã»ã¹ã®æé©åãæ¹åã§ããé åãç¹å®ããããã«ã培åºçãªã³ãŒãã¬ãã¥ãŒã宿œããŸããè€æ°ã®ç®ã§èŠãããšã§ãèŠéããããŠãããããããªãåé¡ãæããã«ãªããŸãã
- ããã¥ã¡ã³ããŒã·ã§ã³ïŒ æé©åæŠç¥ãã³ã³ãã€ã©ãã©ã°ãããã³ããã©ãŒãã³ã¹ã®ãã¬ãŒããªããææžåããŸãããã®æ å ±ã¯ãå°æ¥ã®ã¡ã³ããã³ã¹ãšã³ã©ãã¬ãŒã·ã§ã³ã«ãšã£ãŠéèŠã§ãã
ã°ããŒãã«ãªåœ±é¿ãšå¿çš
WebAssemblyã¯ã倿§ãªãã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã«åœ±é¿ãäžãããã°ããŒãã«ãªãªãŒããæã€å€é©çãªæè¡ã§ãã颿°ããŒãã«ã®æé©åã«ããããã©ãŒãã³ã¹åäžã¯ãæ§ã ãªåéã§å ·äœçãªå©ç¹ã«å€æãããŸãïŒ
- Webã¢ããªã±ãŒã·ã§ã³ïŒ Webã¢ããªã±ãŒã·ã§ã³ã®èªã¿èŸŒã¿æéã®ççž®ãšã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæ±äº¬ããã³ãã³ã®è³ãããªéœåžãããããŒã«ã®é éå°ã®æãŸã§ãäžçäžã®ãŠãŒã¶ãŒã«å©çããããããŸãã
- ã²ãŒã éçºïŒ Webäžã§ã®ã²ãŒã ããã©ãŒãã³ã¹ã®åäžããã©ãžã«ãã€ã³ããå«ãäžçäžã®ã²ãŒããŒã«ããæ²¡å ¥æã®ããäœéšãæäŸããŸãã
- ç§åŠèšç®ïŒ è€éãªã·ãã¥ã¬ãŒã·ã§ã³ãšããŒã¿åŠçã¿ã¹ã¯ã®é«éåãå Žæã«é¢ä¿ãªããäžçäžã®ç ç©¶è ãç§åŠè ãåã¥ããŸãã
- ãã«ãã¡ãã£ã¢åŠçïŒ ãããªãšãªãŒãã£ãªã®ãšã³ã³ãŒã/ãã³ãŒãã®æ¹åãã¢ããªã«ãæ±åã¢ãžã¢ãªã©ãããŸããŸãªãããã¯ãŒã¯ç¶æ³ã®åœã ã®ãŠãŒã¶ãŒã«å©çããããããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ïŒ ç°ãªããã©ãããã©ãŒã ãããã€ã¹éã§ã®ããã©ãŒãã³ã¹ã®é«éåãã°ããŒãã«ãªãœãããŠã§ã¢éçºãä¿é²ããŸãã
- ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ïŒ ãµãŒããŒã¬ã¹é¢æ°ãã¯ã©ãŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹æé©åãäžççã«å¹çæ§ãšå¿çæ§ãåäžãããŸãã
ãããã®æ¹åã¯ãèšèªãæåãå°ççãªå Žæã«é¢ä¿ãªããäžçäžã§ã·ãŒã ã¬ã¹ã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ããWebAssemblyãé²åãç¶ããã«ã€ããŠã颿°ããŒãã«æé©åã®éèŠæ§ã¯å¢ãã°ããã§ããã驿°çãªã¢ããªã±ãŒã·ã§ã³ãããã«å¯èœã«ããŸãã
çµè«
颿°ããŒãã«ã®ã¢ã¯ã»ã¹é床ãæé©åããããšã¯ãWebAssemblyã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæå€§åããäžã§éèŠãªéšåã§ããåºç€ãšãªãã¡ã«ããºã ãçè§£ãã广çãªæé©åæŠç¥ãæ¡çšãã宿çã«ãã³ãããŒã¯ãè¡ãããšã§ãéçºè ã¯Wasmã¢ãžã¥ãŒã«ã®é床ãšå¹çãå€§å¹ ã«åäžãããããšãã§ããŸãããã®èšäºã§èª¬æããæè¡ïŒæ éãªã³ãŒãèšèšãé©åãªã³ã³ãã€ã©èšå®ãã¡ã¢ãªç®¡çãªã©ïŒã¯ãäžçäžã®éçºè ã®ããã®å æ¬çãªã¬ã€ããæäŸããŸãããããã®æè¡ãé©çšããããšã§ãéçºè ã¯ããé«éã§ãããå¿çæ§ãé«ããã°ããŒãã«ã«åœ±é¿åã®ããWebAssemblyã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
Wasmãã³ã³ãã€ã©ãããŒããŠã§ã¢ã®ç¶ç¶çãªçºå±ã«äŒŽããç¶æ³ã¯åžžã«é²åããŠããŸããææ°æ å ±ãå ¥æããå³å¯ã«ãã³ãããŒã¯ãè¡ããããŸããŸãªæé©åã¢ãããŒãã詊ããŠãã ããã颿°ããŒãã«ã®ã¢ã¯ã»ã¹é床ããã®ä»ã®ããã©ãŒãã³ã¹ãéèŠãªé åã«çŠç¹ãåœãŠãããšã§ãéçºè ã¯WebAssemblyã®å¯èœæ§ãæå€§éã«åŒãåºããäžçäžã®Webããã³ã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³éçºã®æªæ¥ã圢äœãããšãã§ããŸãã